home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / packet / p_aa4re / bb212src / bbtaski.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-01-20  |  5.0 KB  |  154 lines

  1. (*===========================================================================*)
  2. (* Task switcher init                                                        *)
  3. (*                                                                           *)
  4. (*   Copyright 1988, 1989, 1990, 1991 by H. Roy Engehausen.  All rights      *)
  5. (*   reserved.                                                               *)
  6. (*                                                                           *)
  7. (*===========================================================================*)
  8.  
  9. {$UNDEF taskdebug}
  10. {$UNDEF taskalbug}
  11.  
  12. (*===========================================================================*)
  13. (* Initialize switcher                                                       *)
  14. (*===========================================================================*)
  15.  
  16. PROCEDURE task_init;
  17.  
  18.   VAR
  19.     array_size  : LONGINT;
  20.     i           : WORD;
  21.     stack_place : POINTER;
  22.     stack_size  : WORD;
  23.  
  24.  
  25.   FUNCTION build_a_tcb(stack_size : WORD; task_no : BYTE) : tcb_ptr;
  26.  
  27.     VAR
  28.       new_tcb : tcb_ptr;
  29.  
  30.     BEGIN;
  31.  
  32.       NEW(new_tcb);
  33.       FILLCHAR(new_tcb^, SIZEOF(tcb), #0);
  34.  
  35.       WITH new_tcb^ DO
  36.         BEGIN;
  37.  
  38.           tcb_dead   := TRUE;
  39.           tcb_number := task_no;
  40.  
  41.           GETMEM(stack_place, stack_size);
  42.           FILLCHAR(stack_place^, stack_size, 0);
  43.           sseg_init := SEG(stack_place^);
  44.           sptr_init := stack_size + OFS(stack_place^) - 16;
  45.  
  46.           {$IFDEF taskdebug}
  47.             WRITELN;
  48.             WRITELN('TASKNO  = ',task_no);
  49.             WRITELN('STACK   = ',p2x(stack_place));
  50.             WRITELN('HEAPPTR = ',p2x(HEAPPTR));
  51.             WRITELN('SPTR    = ', sptr_init);
  52.             WRITELN;
  53.             DELAY(3000);
  54.           {$ENDIF};
  55.  
  56.         END;
  57.  
  58.       build_a_tcb := new_tcb
  59.  
  60.     END;
  61.  
  62.   BEGIN;
  63.  
  64.     (*-----------------------------------------------------------------------*)
  65.     (* Show we are in system startup                                         *)
  66.     (*-----------------------------------------------------------------------*)
  67.  
  68.     system_startup := TRUE;
  69.  
  70.     (*-----------------------------------------------------------------------*)
  71.     (* Initialize some things                                                *)
  72.     (*-----------------------------------------------------------------------*)
  73.  
  74.     dead_tcb_list := NIL;
  75.  
  76.     (*-----------------------------------------------------------------------*)
  77.     (* Allocate the array of TCBS                                            *)
  78.     (*-----------------------------------------------------------------------*)
  79.  
  80.     array_size := (LONGINT(opt_block.max_task_no) + 1)
  81.                                                   * SIZEOF(task_array_element);
  82.  
  83.     GETMEM(task_array_ptr, array_size);
  84.  
  85.     (*-----------------------------------------------------------------------*)
  86.     (* Now allocate the TCBs                                                 *)
  87.     (*-----------------------------------------------------------------------*)
  88.  
  89.     FOR i := 1 TO opt_block.max_task_no DO
  90.       BEGIN;
  91.         task_array_ptr^[i].element_stack_size := user_stack_size;
  92.         task_array_ptr^[i].element_tcb_ptr :=
  93.                                           build_a_tcb(user_stack_size, i + 19);
  94.       END;
  95.  
  96.     {$IFDEF taskdebug}
  97.       WRITELN;
  98.       WRITELN('HEAPORG = ',p2x(HEAPORG));
  99.       WRITELN('HEAPPTR = ',p2x(HEAPPTR));
  100.       WRITELN('FREEPTR = ',p2x(FREEPTR));
  101.       WRITELN('STACK   = ',pw2x(SSEG, SPTR));
  102.       WRITELN('DSEG    = ',w2x(DSEG));
  103.       WRITELN('PREFIX  = ',w2x(PREFIXSEG));
  104.       WRITELN;
  105.       DELAY(3000);
  106.     {$ENDIF}
  107.  
  108.     (*-----------------------------------------------------------------------*)
  109.     (* Now allocate the forward sub_task                                     *)
  110.     (*-----------------------------------------------------------------------*)
  111.  
  112.     INC(opt_block.max_task_no);
  113.     i := opt_block.max_task_no;
  114.     task_array_ptr^[i].element_stack_size := forwardsub_stack_size;
  115.     task_array_ptr^[i].element_tcb_ptr :=
  116.                                    build_a_tcb(forwardsub_stack_size, i + 19);
  117.  
  118.     {$IFDEF taskalbug}
  119.       WRITELN('FWDTASK init = ', i, ' / ', forwardsub_stack_size);
  120.       DELAY(1000);
  121.     {$ENDIF}
  122.  
  123.     (*-----------------------------------------------------------------------*)
  124.     (* Exit with task 1 running but use the dummy port                       *)
  125.     (*-----------------------------------------------------------------------*)
  126.  
  127.     NEW(active_tcb);
  128.     FILLCHAR(active_tcb^, SIZEOF(tcb), 0);
  129.  
  130.     active_tcb^.tcb_number := 1;
  131.  
  132.     active_port := @dummy_port;
  133.  
  134.     tcb_init(active_tcb);
  135.  
  136.     active_tcb^.next_tcb := active_tcb;
  137.  
  138.     ring_tcb             := active_tcb;
  139.  
  140.     alive_tcb_count := 1;
  141.  
  142.     main_tcb := active_tcb;
  143.  
  144.     main_tcb^.tcb_type := th_main;
  145.  
  146.     {$IFDEF taskdebug}
  147.       WRITELN;
  148.       WRITELN('Exit taski');
  149.       WRITELN;
  150.       DELAY(3000);
  151.     {$ENDIF}
  152.  
  153.   END;
  154.